#!/usr/bin/python
# -*- coding: utf-8 -*-

# Dieses Script kontrolliert eine Lösung. Es wird ausgegeben, wie viele Farben
# verwendet wurden und wie groß das Dreieck ist. 
# Funktioniert nur mit korrekter Eingabedatei (keine Leerzeichen zum trennen der 
# Farben, neue Zeilen für eine neue Ebene des n-Traumrechtecks)

import copy, os
from optparse import OptionParser

import psyco
psyco.full()

parser = OptionParser()
parser.add_option("-i", "--input", dest="solutionfile", 
                default= os.getcwd() + '/Beispiele/solution-4-errors.txt',
                help="Textdatei mit der Loesung",
                metavar="FILE")
parser.add_option("-s", "--short",
                action="store_true", dest="short", default=False,
                help="Die Meldungen erscheinen in Kurzform.")
parser.add_option("-e", "--errors",
                action="store_true", dest="display_errors", default=False,
                help="Die Fehler werden ausgegeben.")
(options, args) = parser.parse_args()

solutionfile = options.solutionfile
display_errors=options.display_errors

# 12345m = x
# 2
# 3
# 4
# 5
# n = y

# Get Data######################################################################
# my_data[ebene - startet oben ][position - startet links]

def check_all_left_top(rectangle, x1, y1):
    # Auf Fehler überprüfen:
    # Die aktuelle kugel (x1, y1) ist links oben
    error_list = []
    links_oben = rectangle[x1][y1]

    for x2 in xrange(x1+1, m):
        rechts_oben = rectangle[x2][y1]
        for y2 in xrange(y1+1, n):
            links_unten  = rectangle[x1][y2]
            rechts_unten = rectangle[x2][y2]
            if links_oben == links_unten == rechts_oben == rechts_unten:
                error_list.append([(x1,y1),(x1,y2), (x2, y1), (x2, y2)])
    return error_list

def get_all_errors(rectangle):
    errors = []
    for x1, ebene in enumerate(rectangle):
        for y1, farbe in enumerate(ebene):
            errors_tmp = check_all_left_top(rectangle, x1, y1)
            for line in errors_tmp:
                errors.append(line)
    return errors

def get_data(filename):
    my_data = []
    f = open(filename, 'r')
    lines = f.readlines()
    for line in lines:
      temp = line.strip()
      #temp = temp.split(' ')
      my_data.append(temp)
    return my_data

def get_colors(my_data):
    colors = []
    for liste in my_data:
        for color in liste:
            if not color in colors:
                colors.append(color)
    return colors

rectangle = get_data(solutionfile)
color_list = get_colors(rectangle)
n = len(rectangle)
m = len(rectangle[0])
error_list = get_all_errors(rectangle)

print str(n) + "x" + str(m)
print "Es wurden " + str(len(color_list)) + " Farben verwendet."
print "Es wurden " + str(len(error_list))+ " Fehler gefunden."
if display_errors:
    for error in error_list:
        print error
